package de.fh.dortmund.pk1.aufgabe1.cluedo;


import java.io.Serializable;
import java.util.Scanner;
import java.util.Vector;

import javax.swing.JLabel;

//import de.fh.dortmund.pk1.aufgabe1.cmd.Konsole;
import de.fh.dortmund.pk1.aufgabe1.gui.FastGewonnenGUI;
import de.fh.dortmund.pk1.aufgabe1.gui.GewonnenGUI;
import de.fh.dortmund.pk1.aufgabe1.gui.Spielbrett;
import de.fh.dortmund.pk1.aufgabe1.gui.AusgeschiedenGUI;

/**
 * @author   marcs
 */
public abstract class Spieler implements Serializable {

	//wichtige Variabeln
	protected String name;
	protected JLabel bildSpieler;
	protected int xPosition;
	protected int yPosition;
	protected String inRaum = "";
	protected String[] gesehen = new String[21];		// Karten, welche Spieler gezwigt wurden  	// TODO Kann wohl raus
	protected int gesehenIndex = 0; 
	protected String[] karten = new String[3];
	protected int wueCounter = 0;
	protected Spieler nachbarLinks;
	protected boolean nochDrin = true;

	/* Welche Karten noch nicht gesehen wurden */
	protected Vector<String> verdNNG = new Vector<String>();
	protected Vector<String> raumNNG = new Vector<String>();
	protected Vector<String> waffeNNG = new Vector<String>();
	protected String zuletztGes;
	protected boolean berVerd;		// Wenn bereits Verdaechtigt aber noch in Raum drin


		/* KONSTRUKTOREN */
	
	public Spieler() {
		verdNNGInit();
		raumNNGInit();
		waffeNNGInit();	
	}

		/* PUBLIC METHODEN */
	
	/**
	 * @param nochDrin   Setzt ob ein Spieler noch drin ist.
	 * @uml.property  name="nochDrin"
	 */
	public void setNochDrin(boolean nochDrin) {
		if(!nochDrin)
			Spielbrett.anzNochDrin--;
		this.nochDrin = nochDrin;
	}
	
	public boolean getNochDrin() {
		return nochDrin;
	}
	
	public void setGesehen(String gesehen)
	{
		this.gesehen[gesehenIndex] = gesehen;
		gesehenIndex++;
	}
	
	public void setInRaum(String inRaum) {
		this.inRaum = inRaum;
	}
	
	public void setZuletztGes(String ges)
	{
		zuletztGes = ges;
	}

	public void setNachbarLinks(Spieler links) {
		this.nachbarLinks = links;
	}

	public int getWueCounter() {
		return wueCounter;
	}

	public void setWueCounter(int wueCounter) {
		this.wueCounter = wueCounter;
	}

	public String getName() {
		return name;
	}

	public int getXPosition() {
		return xPosition;
	}
	
	public int getYPosition() {
		return yPosition;
	}
	
	public void setXPosition(int xPosition) {
		this.xPosition=xPosition;
	}
	
	public void setYPosition(int yPosition) {
		this.yPosition=yPosition;
	}
	
	public String[] getKarten() {
		return karten;
	}

	public Spieler getNachbarLinks() {
		return nachbarLinks;
	}

	public JLabel getBildSpieler() {
		return bildSpieler;
	}

	public String[] getGesehen()
	{
		return gesehen;
	}
	
	public String getInRaum() {
		return inRaum;
	}

	//simuliert ein Wuerffelwurf
	public void wurf() {
		int gewuerfelt = Zufall.zufaelligeZahl(11) + 1;
		//zählt alten Counter + neuen Wurf zusammen
		wueCounter = gewuerfelt;
	
	}

	/**
	 * Loescht eine (gesehene) Karte aus dem entsprechendem Array. 
	 * @param Karte Zu loeschende Karte
	 * @return Karte welche geloescht wurde, <br> Leerer String, wenn Karte bereits gekoescht war.
	 */
	public String karteGes(String Karte) {
		// Verdaechtige checken
		for(int i=0; i<verdNNG.size(); i++) {
			if(verdNNG.get(i).equals(Karte)) {
				verdNNG.remove(i);
				return Karte;
			}
		}
		
		// Raueme checken (nur wenn nicht in verdNNG war)
		for(int i=0; i<raumNNG.size(); i++) {
			if(raumNNG.get(i).equals(Karte)) {
				raumNNG.remove(i);
				return Karte;
			}
		}
		
		// waffen checken (nur wenn nicht in raumNNG war)
		for(int i=0; i<waffeNNG.size(); i++) {
			if(waffeNNG.get(i).equals(Karte)) {
				waffeNNG.remove(i);
				return Karte;
			}
		}
		
		return "";
	}
	
	/**
	 * Karte auswaehlen, falls eine im verdacht stehden KArte vorhanden ist.
	 * 
	 * @param karte1 Erste Karte im Verdacht.
	 * @param karte2 Zweite Karte im Verdacht.
	 * @param karte3 Dritte Karte im Verdacht.
	 * @return Liefert die ausgewaehlte zu zeigende Karte
	 */
	//Abstrakte Methode
	public abstract void zeigeKarte(String karte1, String karte2,
			String karte3, Spieler sp);

			
	public boolean hatKarte(String person, String raum, String waffe)
	{
		String[] kart = {person, raum, waffe};
		boolean retBool = false;
		
		for(int i=0; i<3; i++){
			for(int j=0; j<3; j++){
				if(kart[i].compareTo(karten[j]) == 0){
					retBool = true;
		}}}
		
		return retBool;
	}
	
	/* 
	 * Nur nochma, damit Raum als String uebergeben werden kann
	 * wollte nicht einfach loeschen, 
	 * falls wo anders noch so benoetigt wird!
	 * TODO vll kanns wieda raus wenn dich raum uebergebn wird od ganz alte benutzen
	 */
	public void verdaechtige(String person, String raum, String waffe) {
		Spielbrett.spielerSetzen(person, raum);
		
		Spielbrett.his.append("Spieler " + this.getName() + " verdaechtigt:\n");
		Spielbrett.his.append("Person: " + person + "; Raum: " + raum + "; Waffe: " + waffe + "\n");
		
		if(nachbarLinks.hatKarte(person, raum, waffe)){
			nachbarLinks.zeigeKarte(person, raum, waffe, this);
		}	
		else {
			Spieler nextSp = nachbarLinks.getNachbarLinks();
			if(nextSp.hatKarte(person, raum, waffe)) {
				nextSp.zeigeKarte(person, raum, waffe, this);
			}
			else {
				Spieler nextSp2 = nextSp.getNachbarLinks();
				if(nextSp2.hatKarte(person, raum, waffe)) {
					nextSp2.zeigeKarte(person, raum, waffe, this);
				}
				else {
					Spieler nextSp3 = nextSp2.getNachbarLinks();
					if(nextSp3.hatKarte(person, raum, waffe)) {
						nextSp3.zeigeKarte(person, raum, waffe, this);
					}
					else {
						Spieler nextSp4 = nextSp3.getNachbarLinks();
						if(nextSp4.hatKarte(person, raum, waffe)) {
							nextSp4.zeigeKarte(person, raum, waffe, this);
						} 
						else{
							Spielbrett.nextRoundButton.setEnabled(true);
							new FastGewonnenGUI();
						}
					}
				}
			}
		}
			
		
		
	}
		
		
	public void anklagen(String person, String raum, String waffe) {
		Spielbrett.spielerSetzen(person, raum);
		
		Spielbrett.his.append("Spieler " + this.getName() + " klagt an:\n");
		Spielbrett.his.append("Person: " + person + "; Raum: " + raum + "; Waffe: " + waffe + "\n");
		
		boolean unschuldig = false;
		
		if(nachbarLinks.hatKarte(person, raum, waffe))
			unschuldig = true;
		else {
			Spieler nextSp = nachbarLinks.getNachbarLinks();
			if(nextSp.hatKarte(person, raum, waffe))
				unschuldig = true;
			else {
				Spieler nextSp2 = nextSp.getNachbarLinks();
				if(nextSp2.hatKarte(person, raum, waffe)) 
					unschuldig = true;
				else {
					Spieler nextSp3 = nextSp2.getNachbarLinks();
					if(nextSp3.hatKarte(person, raum, waffe))
						unschuldig = true;
					else {
						Spieler nextSp4 = nextSp3.getNachbarLinks();
						if(nextSp4.hatKarte(person, raum, waffe))
							unschuldig = true;
					}
				}
			}
		}
		
		if(unschuldig) {
			setNochDrin(false);
			new AusgeschiedenGUI(this.name);
		}else{
			new GewonnenGUI(this.name, true);
		}
	}
	
	
		/* PRIVATE METHODEN */
	
	private void verdNNGInit() {
		verdNNG.add(Karte.getVerd()[0]);
		verdNNG.add(Karte.getVerd()[1]);
		verdNNG.add(Karte.getVerd()[2]);
		verdNNG.add(Karte.getVerd()[3]);
		verdNNG.add(Karte.getVerd()[4]);
		verdNNG.add(Karte.getVerd()[5]);
	}
	
	private void raumNNGInit() {
		raumNNG.add(Karte.getRaum()[0]);
		raumNNG.add(Karte.getRaum()[1]);
		raumNNG.add(Karte.getRaum()[2]);
		raumNNG.add(Karte.getRaum()[3]);
		raumNNG.add(Karte.getRaum()[4]);
		raumNNG.add(Karte.getRaum()[5]);
		raumNNG.add(Karte.getRaum()[6]);
		raumNNG.add(Karte.getRaum()[7]);
		raumNNG.add(Karte.getRaum()[8]);
	}
	
	private void waffeNNGInit() {
		waffeNNG.add(Karte.getWaffe()[0]);
		waffeNNG.add(Karte.getWaffe()[1]);
		waffeNNG.add(Karte.getWaffe()[2]);
		waffeNNG.add(Karte.getWaffe()[3]);
		waffeNNG.add(Karte.getWaffe()[4]);
		waffeNNG.add(Karte.getWaffe()[5]);
	}
}
